import sys
import os
from matplotlib import pyplot as plt
sys.path.insert(0, os.path.abspath('../'))
sys.path.insert(0, os.path.abspath('../../'))
import qiskit
provider = qiskit.IBMQ.load_account()
import optuna
from qiskit import Aer
from qiskit.algorithms import QAOA
from qiskit_optimization.algorithms import MinimumEigenOptimizer
from shared.QiskitMaxcut import *
from shared.Mitiq_QAOA import *
from ibm.ibm_parameters import *
%matplotlib inline
print_parameters()
Optimizers: ['SPSA', 'QN-SPSA', 'COBYLA'] with MaxIter of 5 Number of shots: 8000 Repetitions: [ 1; 5 ] Gamma value interval: [ -3.141592653589793; 3.141592653589793 ] Beta value interval: [ 3.141592653589793;-3.141592653589793 ] Number of Optuna Trials: 5 Noise Backend Name: ibmq_toronto
# ---- Define graph and MaxCut ----
graph = load_graph()
max_cut = Maxcut(graph)
max_cut_qubo = max_cut.to_qubo()
max_cut.draw()
def init_qaoa(optimizer, reps, init_parameters):
quantum_instance = QuantumInstance(
backend=Aer.get_backend(DEFAULT_QASM_SIMULATOR),
shots=SHOTS,
)
# generate QAOA to get circuit
pre_qaoa = QAOA(optimizer=COBYLA(maxiter=1, tol=0), quantum_instance=quantum_instance, reps=reps, initial_point=init_parameters)
MinimumEigenOptimizer(pre_qaoa).solve(max_cut_qubo)
circuit = pre_qaoa.get_optimal_circuit()
circuit.measure_all()
if optimizer == "QN-SPSA":
fidelity = QNSPSA.get_fidelity(pre_qaoa.ansatz)
optimizer = QNSPSA(fidelity, maxiter=MAX_ITER)
mitiq_qaoa = Mitiq_QAOA(mitiq_circuit=circuit.copy(),
optimizer=optimizer,
quantum_instance=quantum_instance,
reps=reps,
initial_point=init_parameters)
return mitiq_qaoa
def run(max_cut_problem, qaoa):
# Run quantum algorithm QAOA
algorithm = MinimumEigenOptimizer(qaoa)
result = algorithm.solve(max_cut_problem)
optimal_parameters = qaoa.optimal_params
return result, optimal_parameters.copy()
def objective(trial):
optimizer_name = trial.suggest_categorical("optimizer", optimizers.keys())
reps = trial.suggest_int('reps', REPS_MIN, REPS_MAX)
parameters = []
for i in range(reps):
parameters.append(trial.suggest_uniform(f'gamma_{i}', GAMMA_MIN, GAMMA_MAX))
for i in range(reps):
parameters.append(trial.suggest_uniform(f'beta_{i}', BETA_MIN, BETA_MAX))
optimizer = optimizers[optimizer_name]
qaoa = init_qaoa(optimizer, reps, parameters)
result, optimal_parameters = run(max_cut_qubo, qaoa)
mean, distribution = max_cut.analyse(result)
trial.set_user_attr(key="best", value=[mean,result,optimal_parameters, optimizer_name])
return mean
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=N_TRIALS, callbacks=[save_best_trial])
[I 2021-08-09 09:40:51,818] A new study created in memory with name: no-name-555b9581-5807-4254-9084-6c590338d130 [I 2021-08-09 09:42:15,923] Trial 0 finished with value: -91.439125 and parameters: {'optimizer': 'COBYLA', 'reps': 3, 'gamma_0': 2.238221750086849, 'gamma_1': 2.8431339945480065, 'gamma_2': -2.103510595301677, 'beta_0': 0.8444237293724419, 'beta_1': -2.8085768321890896, 'beta_2': -0.0989158298194206}. Best is trial 0 with value: -91.439125. [I 2021-08-09 10:08:55,299] Trial 1 finished with value: -90.33137499999921 and parameters: {'optimizer': 'SPSA', 'reps': 1, 'gamma_0': -2.1118282794497656, 'beta_0': 2.8765574336437565}. Best is trial 0 with value: -91.439125. [I 2021-08-09 10:47:03,441] Trial 2 finished with value: -88.83250000000056 and parameters: {'optimizer': 'QN-SPSA', 'reps': 5, 'gamma_0': -2.5781793296658497, 'gamma_1': 1.9634821396118607, 'gamma_2': -1.7806335282725472, 'gamma_3': -1.413901663979443, 'gamma_4': 1.4607735614621031, 'beta_0': 1.9686412512766474, 'beta_1': -0.1771232055401466, 'beta_2': 0.7046427895677136, 'beta_3': -1.173986039656324, 'beta_4': -1.974895591077518}. Best is trial 0 with value: -91.439125. [I 2021-08-09 11:12:50,332] Trial 3 finished with value: -91.20974999999983 and parameters: {'optimizer': 'QN-SPSA', 'reps': 1, 'gamma_0': 0.8804388521385809, 'beta_0': 1.3862560660368954}. Best is trial 0 with value: -91.439125. [I 2021-08-09 12:03:06,198] Trial 4 finished with value: -88.47862500000087 and parameters: {'optimizer': 'QN-SPSA', 'reps': 1, 'gamma_0': -0.5655252958701982, 'beta_0': -0.5301624795777027}. Best is trial 0 with value: -91.439125.
print(study.best_trial)
FrozenTrial(number=0, values=[-91.439125], datetime_start=datetime.datetime(2021, 8, 9, 9, 40, 51, 823035), datetime_complete=datetime.datetime(2021, 8, 9, 9, 42, 15, 535316), params={'optimizer': 'COBYLA', 'reps': 3, 'gamma_0': 2.238221750086849, 'gamma_1': 2.8431339945480065, 'gamma_2': -2.103510595301677, 'beta_0': 0.8444237293724419, 'beta_1': -2.8085768321890896, 'beta_2': -0.0989158298194206}, distributions={'optimizer': CategoricalDistribution(choices=('SPSA', 'QN-SPSA', 'COBYLA')), 'reps': IntUniformDistribution(high=5, low=1, step=1), 'gamma_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793)}, user_attrs={'best': [-91.439125, optimal function value: -163.0
optimal value: [1. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.]
status: SUCCESS, array([ 3.23822175, 2.84313399, -2.1035106 , 0.84442373, -2.80857683,
-0.09891583]), 'COBYLA']}, system_attrs={}, intermediate_values={}, trial_id=0, state=TrialState.COMPLETE, value=None)
fig = optuna.visualization.plot_optimization_history(study)
fig.show()
mean, result, optimal_params, optimizer_name = study.user_attrs["best"]
print(f"Optimizer: {optimizer_name}")
print(f"Optimal Parameters: {optimal_params}")
Optimizer: COBYLA Optimal Parameters: [ 3.23822175 2.84313399 -2.1035106 0.84442373 -2.80857683 -0.09891583]
max_cut.draw(result)
mean, distribution = max_cut.analyse(result, print_output=True)
max_cut.plot_histogram(distribution, mean)
optimal function value: -163.0 optimal value: [1. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.] status: SUCCESS Number of samples (6846) is too large to display. Skip. Expectation Value: -91.439125 Highest Exp.Value: -12 with 0.000125 % Lowest Exp.Value: -163 with 0.00025 % Highest Probability: -96 with 0.02675 % Ratio r: 0.5260869205298013 MSE: 1411.6841102931837 RMSE: 37.57238494284311
import qiskit.tools.jupyter
%qiskit_version_table
/home/hm-tlacherm/.local/lib/python3.8/site-packages/qiskit/aqua/__init__.py:86: DeprecationWarning: The package qiskit.aqua is deprecated. It was moved/refactored to qiskit-terra For more information see <https://github.com/Qiskit/qiskit-aqua/blob/main/README.md#migration-guide>
| Qiskit Software | Version |
|---|---|
qiskit-terra | 0.18.1 |
qiskit-aer | 0.8.2 |
qiskit-ignis | 0.6.0 |
qiskit-ibmq-provider | 0.16.0 |
qiskit-aqua | 0.9.4 |
qiskit | 0.29.0 |
qiskit-nature | 0.1.5 |
qiskit-optimization | 0.2.1 |
| System information | |
| Python | 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] |
| OS | Linux |
| CPUs | 192 |
| Memory (Gb) | 6046.015735626221 |
| Mon Aug 09 12:03:17 2021 CEST | |
import mitiq
mitiq.about()
Mitiq: A Python toolkit for implementing error mitigation on quantum computers ============================================================================== Authored by: Mitiq team, 2020 & later (https://github.com/unitaryfund/mitiq) Mitiq Version: 0.9.3 Core Dependencies ----------------- Cirq Version: 0.10.0 NumPy Version: 1.20.3 SciPy Version: 1.4.1 Optional Dependencies --------------------- PyQuil Version: Not installed Qiskit Version: 0.29.0 Braket Version: Not installed Python Version: 3.8.6 Platform Info: Linux (x86_64)